//  传入pthread_create第二个参数来设置线程属性。
#include <iostream>  
#include <pthread.h>  
  
using namespace std;  
  
#define NUM_THREADS 5  
  
void* say_hello(void* args)  
{  
    cout << "hello in thread " << *((int *)args) << endl;  
    int status = 10 + *((int *)args);//将参数加10  
    pthread_exit((void*)status);//由于线程创建时候提供了joinable参数，这里可以在退出时添加退出的信息：status供主程序提取该线程的结束信息；  
}

int main() {
    pthread_t tids[NUM_THREADS];
    int indexes[NUM_THREADS];

    pthread_attr_t attr; //要想创建时加入参数，先声明
    pthread_attr_init(&attr);
    //声明、初始化后第三步就是设置你想要指定线程属性参数，这个参数表明这个线程是可以join连接的，
    //join功能表示主程序可以等线程结束后再去做某事，实现了主程序和线程同步功能，这个深层理解必须通过图示才能解释；参阅其他资料吧 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    for(int i = 0; i < NUM_THREADS; ++i) {
        indexes[i] = i;
        int ret = pthread_create(&tids[i], &attr, say_hello, (void*)&(indexes[i]));
        if (ret != 0) {
            cout << "pthread_create error: error_code=" << ret << endl;
        }
    }

    //参数用完就销毁，防止内存泄漏
    pthread_attr_destroy(&attr);

    void *status;
    for (int i = 0; i < NUM_THREADS; ++i) {
        //前面创建了线程，这里主程序想要join每个线程后取得每个线程的退出信息
        int ret = pthread_join(tids[i], &status);
        if (ret != 0) {
            cout << "pthread_join error: error_code=" << ret << endl;
        } else {
            cout << "pthread_join get status:" << (long)status << endl;
        }

    }
}
